from dataclasses import dataclass
from typing import List
import requests
import os
import uuid
import pandas as pd



'''
变量信息接收类
'''
@dataclass
class GetFileMessageRequest:
    url: str

'''
    变量信息类
'''


@dataclass
class FileVariablesResponse:
    column_number: int  # 列号，防止变量重复
    name: str  # 变量名称
    role: str  # 变量角色
    type: str  # 变量类型
    description: str  # 变量描述
    units: str  # 变量单位
    missing: str  # 是否有缺失值：no/yes


'''
    所有变量封装类
'''


@dataclass
class GetFileMessageResponse:
    features: int  # 特征数量
    instances: int  # 实例数
    output_list: List[FileVariablesResponse]  # 变量类型返回类


class GetFileMessageExecute:
    def getFileInfo(self, url: str):
        ## 1.构建存储路径
        # 获取当前工作目录
        user_dir = os.getcwd()

        # 兼容不同系统的路径分隔符
        global_file_dir_name = 'TEMP_FILE'  # 你可以根据需要设置这个值
        global_file_path_name = os.path.join(user_dir, global_file_dir_name)

        # 判断全局目录是否存在，没有则新建
        if not os.path.exists(global_file_path_name):
            os.makedirs(global_file_path_name)

        ## 2.下载文件
        try:
            # 发送GET请求下载文件
            response = requests.get(url)
            response.raise_for_status()  # 检查请求是否成功

            # 获取文件名和后缀
            file_name, file_extension = os.path.splitext(os.path.basename(url))

            save_path = os.path.join(global_file_path_name, f"{str(uuid.uuid4())}{file_extension}")

            # 将文件内容写入到指定路径
            with open(save_path, 'wb') as file:
                file.write(response.content)
            print(f"文件已成功下载并保存到: {save_path}")

        except requests.exceptions.RequestException as e:
            print(f"下载文件时发生错误: {e}")

        # ## todo 测试用，记得删掉
        # file_extension = '.csv'
        # save_path = "D:\\Code\\WebProjects\\Dataset\\yds-dataset-analyse\\pythonProject\\TEMP_FILE\\6e1e07bc-948c-4543-9bc9-f9350841917b.csv"

        ## 3. 获取文件信息
        getFileMessageResponse = GetFileMessageResponse(features=0, instances=0, output_list=[])
        if file_extension == '.csv':
            # 读取CSV文件
            data = pd.read_csv(save_path)
        elif file_extension in ['.xls', '.xlsx']:
            # 读取Excel文件
            data = pd.read_excel(save_path)

        ## 设置实例数量和特征数量
        excel_rows, excel_columns = data.shape
        getFileMessageResponse.features = excel_columns
        getFileMessageResponse.instances = excel_rows
        print(f"Excel文件的实例数（行数）：{excel_rows}")
        print(f"Excel文件的特征数（列数）：{excel_columns}")

        # 提取列名、角色、类型等信息
        for col in data.columns:
            # 假设我们可以通过列名等方式获取这些信息
            variable_info = FileVariablesResponse(
                column_number=data.columns.get_loc(col) + 1,  # 列号，从1开始
                name=col,
                role='',  # 自己确定
                description='',  # 自己确定
                units='',  # 自己确定
                type=str(data[col].dtype),  # 变量类型
                missing='yes' if data[col].isnull().any() else 'no'  # 是否有缺失值
            )
            getFileMessageResponse.output_list.append(variable_info)
        print(getFileMessageResponse)
        ## 4. 删除临时文件
        if os.path.exists(save_path):
            os.remove(save_path)  # 删除文件
            print(f"{save_path} 被成功删除")
        else:
            print(f"文件 {save_path} 不存在")

        return getFileMessageResponse

if __name__ == "__main__":
    app = GetFileMessageExecute();
    app.getFileInfo(
        "https://yds-dataset-1325553198.cos.ap-shanghai.myqcloud.com/public/1884211650339426305/2025-02-02_4pvkry96oz8pg5qo.csv")
